# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'class11'
__author__ = 'hqDu'
__time__ = '2020-11-27 22:20'
__product_name = 'PyCharm'
# @fileName :class11.py

import os
# print(os.getcwd())
# os.chdir(r'D:\le-bo16\hqdu\第10次课')
# print(os.getcwd())

"""
1.文件备份
"""
# def copyFile():
#     """
#     实现旧文件到新文件的复制
#     :return:
#     """
#     # 获取旧文件的文件名
#     oldFileName = 'D:\le-bo16\hqdu\第10次课\lebo.txt'
#     # 获取旧文件的后缀索引下标
#     fileFlagNum = oldFileName.rfind('.')
#     fileFlagNum1 = oldFileName.rfind('\\')
#     # 获取旧文件的后缀
#     fileFlag = oldFileName[fileFlagNum:]
#
#     # 新文件名称=新的文件路径+旧文件名[复件].旧文件后缀
#     newFileName = os.getcwd() + oldFileName[fileFlagNum1:fileFlagNum] + "[复件]" + fileFlag
#     # 打开旧文件
#     oldFile = open(oldFileName, 'r', encoding='utf-8')
#     # 打开新文件
#     newFile = open(newFileName, 'w', encoding='utf-8')
#     # 获取旧文件的内容oldFile.readlines()，并将列表内内容一行行复制到新的文件内
#     for line in oldFile.readlines():
#         newFile.write(line)
#     # 关闭新旧文件
#     oldFile.close()
#     newFile.close()
#
# copyFile()

"""
2.文件的相关操作

涉及到os模块，需要先import os
"""

# 文件重命名 (源，新)
# os.rename('lebo[复件].txt','lebo1.txt')

# 删除文件
# os.remove('D:\le-bo16\hqdu\第10次课\lebo[复件].txt')

# 创建文件夹
# os.mkdir('文件夹')

# 获取当前目录
# print(os.getcwd())

# 改变默认目录
# os.chdir(r'D:\le-bo16\hqdu\第10次课')
# os.chdir('D:\\le-bo16\\hqdu\\第10次课')
# print(os.getcwd())

# 获取目录列表
# print(os.listdir('./'))

# 删除文件夹
# os.rmdir('文件夹')

# os.chmod()
# os.getuid()
# os.kill()

"""
3.批量修改文件名
"""
# def modify_file_name():
#     """
#     批量修改文件后缀为.txt的文件的文件名
#     :return:
#     """
#     flag = 2
#     folderName = './'
#     fileNameList = os.listdir(folderName)
#     for name in fileNameList:
#         fileFlagNum = name.rfind('.')
#         oldFileFlag = name[fileFlagNum:]
#         if oldFileFlag == '.txt':
#             if flag == 1:
#                 new_name = name[:fileFlagNum] + "[复制]" + name[fileFlagNum:]
#                 os.rename(folderName+name, folderName+new_name)
#             elif flag == 2:
#                 index1 = name.rfind('[')
#                 index2 = name.rfind(']')
#                 new_name = name[:index1] + name[index2+1:]
#                 os.rename(folderName + name, folderName + new_name)
#
# modify_file_name()
# print(os.listdir('./'))


"""
4.面向对象OOP
"""
# 以前写的都是面向过程的

# 面向对象编程的重要概念：类和对象

# 类 = 类名+属性（一组数据）+方法（操作）
# 拥有相同（或类似）属性和行为的对象可以抽象为一个类

"""
定义类
"""
# class 类名:
#     # 方法
#     pass

# 数据库的属性：用户名、密码、端口号、字符集、数据库名称
# 数据库的方法：

# # 方式1：旧式类
# class Hero:
#     pass
# # 方式2：旧式类
# class Hero():
#     pass
# 方式3：新式类，建议
# class Hero(object):
#     """创建实例方法"""
#     def move(self):
#         print("人会走")

# object是python里所有的类的最顶级父类，基类，所有子类的父类，所有类的落脚点
# 类名：大驼峰法，这样才符合PEP8规则
"""
创建方法
"""
# 方法名：命名规则，小驼峰；
# 在类里，叫方法，在类外叫函数
# 默认，self不需要传递，其实self作用就是传递对象（指向实例对象本身），因为方法是对象使用的。
# 所有需要对象使用的方法都有self，必须写，否则报错。self可以使用其他命名
# move()，实例方法，对象可调用，第一个参数一定是self。

"""
对象使用类
"""
# 创建对象
# 对项名 = 类名()，一个类可以创建很多对象
# xiaoming = Hero()  # 为类Hero创建了一个实例对象
# xiaohong = Hero()
# # 对象使用方法
# # 对象调用实例方法时，会默认把对象本身的引用作为参数传递给方法第一个参数self里
# xiaoming.move()
# xiaohong.move()

"""
属性，各种创建属性的方法必须熟练掌握
"""
# 方式1：创建对象以后，再添加属性   代码冗余
# class Hero(object):
#     """创建实例方法"""
#     def move(self):
#         print("人会走")

# # 创建对象，定义属性
# xiaoming = Hero()
# xiaoming.name = '小明'
# xiaoming.age = 18
# xiaoming.height = 150

# # 打印属性，通过成员选择运算符‘.’来获取对象的属性
# print('姓名：', xiaoming.name)
# print('年龄：', xiaoming.age)
# print('身高：', xiaoming.height)

# # 通过成员选择运算符'.'来访问实例方法
# xiaoming.move()

# # 创建对象，定义属性
# xiaohong = Hero()
# xiaohong.name = '小明'
# xiaohong.age = 18
# xiaohong.height = 150
#
# # 打印属性，通过成员选择运算符‘.’来获取对象的属性
# print('姓名：', xiaohong.name)  # 代码冗余
# print('年龄：', xiaohong.age)
# print('身高：', xiaohong.height)
#
# # 通过成员选择运算符'.'来访问实例方法
# xiaohong.move()



# 方式2：在实例方法内通过self访问对象属性
# class Hero():
#     def move(self):
#         print("人会走")
#     def print_info(self):
#         print('姓名：', self.name)  # name/age/height高亮，
#         print('年龄：', self.age)  # 因为代码执行从上向下，当执行到这里时，还没有这些属性名字，因而会高亮提示，对象还未创建
#         print('身高：', self.height)
#         # print('姓名：', xiaoming.name)  # 问题：小红不好去调用
#         # print('年龄：', xiaoming.age)
#         # print('身高：', xiaoming.height)
#
# xiaoming = Hero()
# xiaoming.name = '小明'
# xiaoming.age = 18
# xiaoming.height = 150
# xiaoming.print_info()
# xiaoming.move()
#
# xiaohong = Hero()

# 方式3：魔法方法 __init__()，创建对象的同时添加属性
# 魔法方法:Python 的类里提供的，两个下划线开始，两个下划线结束的方法,就是魔法方法

# __init__()：python的类里，实现属性赋值，不需要调用，在类创建对象成功之后才会调用此方法
# 如果类里面没有__init__()方法，python会自动创建此方法。
# 所以任何一个类里，无论是否编写了__init__()，必有__init__()方法
# __init__(self)中的self，不需要传参，因为python解释器会自动把当前对象的引用传递过去


# class Hero():
#     # 给对象的属性赋值
#     # 无参数的__init__()魔法方法
#     # def __init__(self):
#     #     print("__init__")
#     #     self.name = '小明'  # 属性具有默认值
#     #     self.age = 18
#     #     self.height = 150
#     # 有参数的__init__()魔法方法
#     # def __init__(self,name,age,height):
#     #     self.name = name
#     #     self.age = age
#     #     self.height = height
#     # 带有缺省参数的__init__()魔法方法
#     def __init__(self, name, age, height=168):  # 缺省参数要放在最后。与函数的创建方法一样
#         self.name = name
#         self.age = age
#         self.height = height
#
#     # 实例方法
#     def move(self):
#         print("人会走")
#     # 实例方法
#     def print_info(self):
#         print('姓名：', self.name)
#         print('年龄：', self.age)
#         print('身高：', self.height)
#
# xiaoming = Hero('小明',18,150)
# xiaoming.print_info()
# xiaoming.move()
# xiaohong = Hero('小红',16,168)
# xiaohong.print_info()
# xiaohong.move()

# 打印对象的内存地址
# print(xiaoming)
# print(xiaohong)

# 不同对象的属性值单独保存，属性的id不一致
# print(id(xiaoming.name))
# print(id(xiaohong.name))

# 同一个类的不同对象，实例方法共享，方法的id一致
# print(id(xiaohong.print_info))
# print(id(xiaoming.print_info))

# 1.在类内部，调用属性和方法，通过self
# 2.在类外部，调用属性和方法，通过对象
# 3.一个类可以有多个对象，每个对象的属性都是各自保存的，都有各自独立的地址
# 4.实例方法是所有对象共享的，只占用一份内存空间。类会通过self来判断，到底是哪个对象调用了实例方法

